#include "ModuleManager.h"
#include "ModuleInterface.h"

using namespace std;


ModuleManager::ModuleManager()
{
}

//vracia odkaz na instanciu tejto triedy
ModuleManager& ModuleManager::GetInstance()
{
	static ModuleManager instance;
	return instance;
}

/*
 * Zaregistruje modul pomocou jeho mena a ukazatela.
 * 
 * @param moduleClassName	meno triedy modulu, ktory chceme registrovat
 * @param moduleToRegister	pointer na modul, ktory registrujeme
 * 
 * @return	ak sa podarilo registrovat vrati true, ak modul uz existuje false
 */
bool ModuleManager::RegisterModule(string moduleClassName, ModuleInterface* moduleToRegister)
{
	if(loadedModules.find(moduleClassName) == loadedModules.end())
	{
		loadedModules[moduleClassName] = moduleToRegister;
		return true;
	}
	else
	{
		return false;
	}
}


/*
 *	Vracia pozadovany modul. Ak neexistuje instancia modulu, vytvori sa novy a vlozi 
 *	sa do loadedModules, inac sa vrati uz nahraty modul.
 *
 *	@param moduleClassName	nazov triedy modulu, ktory chceme ziskat
 *
 *	@return	pointer na modul
 */
ModuleInterface* ModuleManager::GetModule(string moduleClassName)
{
	if(loadedModules.find(moduleClassName) == loadedModules.end())
	{
		return NULL;
	}
	else
	{
		return loadedModules[moduleClassName];
	}
}

//destruktor, vymazu sa vsetky nahrate moduly z mapy
ModuleManager::~ModuleManager()
{
	for(map<string, ModuleInterface*>::iterator it = loadedModules.begin();
		it != loadedModules.end(); ++it)
	{
		delete it->second;
	}
}
